package com.xiaolin.springsecurity.config;

import com.xiaolin.springsecurity.security.CustomAccessDeniedHandler;
import com.xiaolin.springsecurity.security.CustomAuthenticationEntryPoint;
import com.xiaolin.springsecurity.security.CustomAuthenticationFailureHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;


/**
 * @author xiaolin
 * @Description WebSecurityConfig
 * @email xiaolin@gmail.com
 * @date 2024/5/4 10:32
 */
@EnableWebSecurity  // 开启Security功能
@EnableGlobalMethodSecurity(prePostEnabled = true)  // 开启@PreXXX注解安全校验
public class WebSecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .authorizeRequests(authorize -> authorize
                        .antMatchers("/auth/login**").permitAll()  // 配置指定请求允许匿名访问
                        .anyRequest().authenticated()  // 配置所有请求需要认证才能访问
                )
                .formLogin(form ->
                        form.loginPage("/auth/login") // 自定义登录页
                                .permitAll()  // 允许任何人访问登录页
                                .usernameParameter("user")  // 自定义用户参数名
                                .passwordParameter("pwd")  // 自定义密码参数名
                                .defaultSuccessUrl("/auth/index", true)  // 自定义登录成功跳转url
                                .failureUrl("/auth/login?login_error")  // 自定义登录失败跳转url
                                .failureHandler(new CustomAuthenticationFailureHandler())  // 自定义登录失败处理器
                )
                .logout(logout ->
                        logout.logoutSuccessUrl("/auth/login?login_logout") // 自定义注销成功跳转url
                )
                .exceptionHandling(handler -> handler
                        .authenticationEntryPoint(new CustomAuthenticationEntryPoint())  // 自定义用户未登录处理器
                        .accessDeniedHandler(new CustomAccessDeniedHandler())  // 自定义用户无权限处理器
                )
                .csrf().disable() // 取消 csrf 防护，这样注销可以使用get请求，而无需post请求
        ;
        return http.build();
    }

    /**
     * 默认用户数据是存储到内存中的
     *
     * @return
     */
//    @Bean
//    public UserDetailsService userDetailsService() {
//        // 用户认证管理器
//        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
//        // 初始化用户数据到内存中
//        manager.createUser(User.withDefaultPasswordEncoder().username("user").password("123456").roles("USER").build());
//        return manager;
//    }

    /**
     * 自定义密码加密器
     *
     * @return
     */
    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }


}
